package com.example.springioc.controller;

import com.example.springioc.model.User;
import com.example.springioc.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    // 1. 属性注入
    // 优势： 简洁明了
    // 劣势： 1. 不能使用 final 修饰 2. 只能用于 IoC中
//    @Autowired
//    private UserService userService;

    // 2. 构造方法注入
    // 当没有无参构造方法的时候 它会自动（被迫）寻找其他有参的构造方法
    // 如果由无参的 那么就使用无参的，所以 下面如果把无参的去掉就可以执行成功 不然就是空指针异常
    // 优点： 1. 可以使用 final 2. 在其他框架中也可以使用（采用jdk 通用性好） 3. 在使用前一定会被初始化 4. 对象不会被修改
    // 缺点： 创建对象比较麻烦
 /*   private UserService userService;

    public UserController() {
    }

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }*/

/*    private final UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }*/


    // 3. 使用 Setter
    // 必须添加 @Autowired
    // 优点： 可以多次修改
    // 缺点： 1. 不能被 final 修饰 2. 有被修改的风险
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void sayHi() {
        System.out.println("Hi, userController");
        userService.sayHi();
    }



    // 1. 在对应的User添加 @Primary 表名优先级 不推荐
//    @Autowired
//    public User user;

    // 2. 采用默认命名 也不推荐
//    @Autowired
//    public User gU1_1; // 名称不能改变

    // 3. 采用 @Qualifier 推荐
    @Qualifier("u1")
    @Autowired
    public User userQualifier;

    // 4. 将 @Qualifier + @Autowired 简写为 @Resource
    @Resource(name = "getUser2")
    public User userResource;

}
